﻿#ifndef NIM_WIN_GUI_DEVICE_CHECK_FORM_H_
#define NIM_WIN_GUI_DEVICE_CHECK_FORM_H_

#include "shared/base.h"
#include "ui_components/windows_manager/window_ex.h"
#include "gui/video/helper/ui_bitmap_control.h"
#include "module/video/video_manager.h"

namespace nim_comp
{

using namespace ui;

enum EnumStepPage
{
	kSpeakerTestPage,		// 扬声器测试页面
	kMicrophoneTestPage,	// 麦克风测试页面
	kCameraTestPage,		// 摄像头测试页面
};

typedef struct
{
	std::string device_name;
	bool		is_success;
} DEVICE_STATUS;

/** @class DeviceCheckForm
  * @brief 设备检测窗口
  * @copyright (c) 2016, NetEase Inc. All rights reserved
  * @author Dylan
  * @date 2019/06/11
  */
class DeviceCheckForm : public WindowEx
{
public:
	DeviceCheckForm();
	virtual ~DeviceCheckForm();
	
	//覆盖虚函数
	virtual std::wstring GetSkinFolder() override;
	virtual std::wstring GetSkinFile() override;
	virtual std::wstring GetWindowClassName() const override;;
	virtual std::wstring GetWindowId() const override;;
	virtual UINT GetClassStyle() const override { return UI_CLASSSTYLE_FRAME | CS_DBLCLKS; };
	virtual LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

	/**
	* 窗口初始化函数
	* @return void	无返回值
	*/
	virtual void InitWindow() override;

	/**
	* 拦截并处理底层窗体消息
	* @param[in] uMsg 消息类型
	* @param[in] wParam 附加参数
	* @param[in] lParam 附加参数
	* @return LRESULT 处理结果
	*/
	virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) override;

	/**
	* 处理窗口被销毁的消息
	* @param[in] hWnd 窗口句柄
	* @return void	无返回值
	*/
	virtual void OnFinalMessage(HWND hWnd) override;

	/**
	* 根据控件类名创建自定义控件
	* @param[in] pstrClass 控件类名
	* @return Control* 创建的控件的指针
	*/
	virtual Control* CreateControl(const std::wstring& pstrClass) override;

private:	//ui
	/**
	* 处理所有控件的所有消息
	* @param[in] msg 消息的相关信息
	* @return bool true 继续传递控件消息，false 停止传递控件消息
	*/
	bool Notify(EventArgs* msg);

	/**
	* 处理所有控件单击消息
	* @param[in] msg 消息的相关信息
	* @return bool true 继续传递控件消息，false 停止传递控件消息
	*/
	bool OnClicked(EventArgs* msg);

	/**
	* 处理所有控件选中消息
	* @param[in] msg 消息的相关信息
	* @return bool true 继续传递控件消息，false 停止传递控件消息
	*/
	bool OnSelect(EventArgs* arg);

public:
	static const LPCTSTR kClassName;

	/**
	 * 初始化音频、视频设备列表
	 */
	void InitDevices();

	/**
	 * 翻页
	 */
	void SwitchPage(bool test_success = true);

	/**
	 * 绘制视频数据
	 */
	void PaintVideo();

	/**
	 * 设备启动回调
	 */
	void OnVideoDeviceStartCallback(bool result);

	/**
	 * 麦克风设备状态改变回调
	 */
	void OnDeviceChange(uint32_t status);

	/**
	 * 测试扬声器
	 */
	void TestSpeaker();

	/**
	 * 测试麦克风
	 */
	void TestMicrophone();

	/**
	 * 播放音频和麦克风数据回调
	 */
	void OnPlayAudioVolumnCb(bool is_capture, int volumn);

private:
	void PlayEffectCallback(ui::Control* pSender, int id, bool ret, int code, const std::string& json_extension);
	void UpdateResultList();
	

private:
	// 公共
	VBox*			test_page_;
	TabBox*			step_tabbox_;
	Label*			notice_label_;
	Button*			option_yes_;
	Button*			option_no_;

	// 扬声器页面控件
	Combo*			speaker_combo_;
	Slider*			speaker_slider_;
	Progress*		speaker_progress_;
	Control*		speaker_normal_;
	Control*		speaker_gif_;
	Button*			speaker_test_;

	// 麦克风页面控件
	Combo*			mic_combo_;
	Slider*			mic_slider_;
	Progress*		mic_progress_;
	Button*			mic_test_;

	// 摄像头页面控件
	Combo*			camera_combo_;
	BitmapControl*	camera_bitmap_;
	Control*		camera_fail_;
	Label*			camera_error_notice_;

	// 测试结果页
	VBox*			result_page_;
	Control*		result_face_;
	Label*			result_title_;
	Label*			result_description_;
	ListBox*		result_list_;
	Button*			result_close_;

	// 功能变量
	std::map<nim::NIMDeviceType, DEVICE_STATUS> result_;
	std::string		test_speaker_name_;
	std::string		test_mic_name_;
	std::string		test_camera_name_;

	bool			camera_is_open_ = false;
	nbase::WeakCallbackFlag paint_video_timer_;
};

}
#endif  // NIM_WIN_GUI_DEVICE_CHECK_FORM_H_
